iT邦幫忙

2023 iThome 鐵人賽

DAY 4
0

昨天提到變數可修改性,今天來說變數為空這件事。在 Kotlin 裡面,我們可以將一個沒有給予型別定義的變數賦予 null ,如: var b = null

可空性 Nullability

可用於限制並標示(給編譯器看)可被賦予 null 的變數。若對於未標示為可空 (Nullability) 的變數賦予 null 則 Kotlin 會在執行時報錯,部分 IDE (eg. IntelliJ) 就可以在 coding 時即時標示這裡有錯👍

另外,若對 null 值直接做運算操作 (包含取值),則 Kotlin 會在執行時間 (runtime) 報錯 (NullPointerException),標示程式欲從空值中取值運算這操作是不合法的。

說了這麼多,啊我就是要讓他可以有值又可以空值的話勒 (下面這張應該是不需要字幕了(X )

https://ithelp.ithome.com.tw/upload/images/20230919/20119910GH65bj6mfD.png

沒關係,Kotlin 懂,我們可以用 ? 加在型別後面,告訴 Kotlin 我就是要讓他可以為 null

var b: Int? = null;

當然,面對更複雜的資料結構或是物件屬性我們依樣可以給他 null,然後這是後你一定會想,如果我會因為要寫型別導致不能給 null 那我不要給他型別就好啦?

https://ithelp.ithome.com.tw/upload/images/20230919/2011991054VzfuB0OK.png

答案是不行!如果我一開始就給他 null 那確實問題不大,因為 Kotlin 貼心的幫你補上了,但如果一開始就不是 null 而是事後被賦予 null 呢? 那很抱歉,還是會噴錯喔 (下方範例 c)!

val b: Int = null   // 錯誤: b 是一個 non-null 型別
var c = 2
c = null            // 錯誤: c 是一個 non-null 型別
var d: Int? = null
var e: Int? = 3
e = null

那我們來挑戰一下吧!下面這是將 Nullability 套用到一個整數 (Int) 串列 (List) 的範例,那些是會在編譯階段 (compile-time) 錯的呢? (答案在文末)

val b: List<Int?> = listOf(null)
val c: List<Int> = listOf(null) 
val d: List<Int>? = null
val e: List<Int>? = listOf(null)
val f: List<Int?> = null        
val g: List<Int?>? = null
val h: List<Int?>? = listOf(null)

Ans. c, e, f


上一篇
Day 3 Kotlin 可變與不可變變數
下一篇
Day 5 變數雜談
系列文
成為一名 Kotlin 後端攻城獅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言